package org.zalando.stups.fullstop.web.test;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
public abstract class RestControllerTestSupport {
protected final ObjectMapper objectMapper = new ObjectMapper();
protected MockMvc mockMvc;
public RestControllerTestSupport() {
objectMapper.findAndRegisterModules();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
}
@Before
public void setUpMockMvc() throws Exception {
final StandaloneMockMvcBuilder mockMvcBuilder = MockMvcBuilders.standaloneSetup(mockMvcControllers());
configure(mockMvcBuilder);
mockMvc = mockMvcBuilder.build();
}
protected abstract Object[] mockMvcControllers();
protected void configure(final StandaloneMockMvcBuilder mockMvcBuilder) {
mockMvcBuilder.setCustomArgumentResolvers(mockMvcCustomArgumentResolvers());
mockMvcBuilder.setMessageConverters(mockMvcMessageConverters());
final DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
mockMvcBuilder.setConversionService(conversionService);
}
protected HttpMessageConverter<?>[] mockMvcMessageConverters() {
final MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setObjectMapper(objectMapper);
return new HttpMessageConverter[] { jsonConverter, new ResourceHttpMessageConverter() };
}
protected HandlerMethodArgumentResolver[] mockMvcCustomArgumentResolvers() {
final PageableHandlerMethodArgumentResolver pageableResolver = new PageableHandlerMethodArgumentResolver();
pageableResolver.setFallbackPageable(new PageRequest(0, 10));
final AuthenticationPrincipalArgumentResolver authenticationPrincipalResolver = new AuthenticationPrincipalArgumentResolver();
return new HandlerMethodArgumentResolver[] { pageableResolver, authenticationPrincipalResolver };
}
}